package org.xx.armory.swing.components.verifiers;

import javax.swing.*;

import static org.xx.armory.swing.UIUtils.toLongObject;

/**
 * 整数的验证器。
 * <p>此验证器进行必填校验，最大值校验和最小值校验。</p>
 */
public class NumberVerifier
        implements TextVerifier {
    private final boolean required;
    private final Long minValue;
    private final Long maxValue;

    /**
     * 构造输入文本校验器。
     *
     * @param required
     *         是否必填。
     * @param minValue
     *         最小值。
     * @param maxValue
     *         最大值。
     */
    public NumberVerifier(
            boolean required,
            Long minValue,
            Long maxValue
    ) {
        this.required = required;
        this.minValue = minValue;
        this.maxValue = maxValue;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VerifiedStatus verify(
            JComponent input
    ) {
        final Object obj;
        if (input instanceof JFormattedTextField) {
            obj = ((JFormattedTextField) input).getValue();
        } else {
            obj = null;
        }

        final Long value;
        if (obj instanceof Number) {
            value = ((Number) obj).longValue();
        } else if (obj instanceof String) {
            value = toLongObject((String) obj);
        } else {
            value = null;
        }

        if (this.required) {
            if (value == null) {
                return VerifiedStatus.REQUIRED_ERROR;
            }
        }
        if (value != null && this.minValue != null) {
            if (value < this.minValue) {
                return VerifiedStatus.TOO_SMALL_ERROR;
            }
        }
        if (value != null && this.maxValue != null) {
            if (value > this.maxValue) {
                return VerifiedStatus.TOO_LARGE_ERROR;
            }
        }
        return VerifiedStatus.OK;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return "number-verify{required=" + this.required + ",min-value=" + this.minValue + ",max-value=" + this.maxValue + "}";
    }
}
